===== 第 1 页 ===== 第8章 GUI(图形用户接口) · Swing顶级容器 · Swing常用组件 · Swing概述 · 事件处理 · JavaFX图形用户界面工具 · 布局管理器 · Swing组件的整合使用 ===== 第 2 页 ===== 学习目标 GUI中的事件处理 1 2 Swing常用组件的使用 JavaFX的配置和基本使用 3 GUI开发的相关原理和布局管理器 JavaFX图形用户工具的概念 掌握 熟悉 了解 ===== 第 3 页 ===== Swing概述 8.1 Swing顶级容器 8.2 布局管理器 8.3 事件处理 8.4 目录 ☞点击查看本小节知识架构 ☞点击查看本小节知识架构 ☞点击查看本小节知识架构 ===== 第 4 页 ===== Swing常用组件 8.5 Swing组件的整合使用 8.6 JavaFX图形用户界面工具 8.7 目录 ☞点击查看本小节知识架构 ☞点击查看本小节知识架构 ☞点击查看本小节知识架构 ===== 第 5 页 ===== 8.2 Swing顶级容器 8.2.1 8.2.2 JFrame JDialog 返回目录 知识架构 ===== 第 6 页 ===== 8.3 布局管理器 返回目录 知识架构 8.3.1 8.3.2 BorderLayout FlowLayout 8.3.3 GridLayout ===== 第 7 页 ===== 8.4 事件处理 8.4.1 8.4.2 事件处理机制 Swing常用事件处理 返回目录 知识架构 ===== 第 8 页 ===== 8.5 Swing常用组件 返回目录 知识架构 8.5.1 8.5.2 面板组件 文本组件 8.5.3 标签组件 8.5.4 8.5.5 按钮组件 下拉框组件 8.5.6 菜单组件 ===== 第 9 页 ===== 8.6 Swing组件的整合使用—QQ登录 返回目录 知识架构 8.6.1 8.6.2 案例分析 案例实现 ===== 第 10 页 ===== 8.7 JavaFX图形用户界面工具 返回目录 知识架构 8.7.1 8.7.2 JavaFX概述 JavaFX开发环境配置 8.7.3 JavaFX基础入门 8.7.4 JavaFX可视化管理工具 ===== 第 11 页 ===== 8.1 Swing概述 什么是AWT? 定义:在早期JDK1.0发布时,Sun公司就为GUI开发提供了一套基础类库,这套类库被称为AWT(Abstract Window Toolkit),即抽象窗口工具包。 目的:AWT的起初设想就是为了统一实现不同操作系统的图像界面。 缺陷: 不同操作系统图形库的功能可能不一样,在一个平台上存在的功能在另外一个平台上则可能不存在,为此AWT不得不通过牺牲功能来实现平台无关性。 AWT是一个重量级组件,使用麻烦,设计出的图形界面不够美观且功能有限。 ===== 第 12 页 ===== 8.1 Swing概述 什么是Swing? 定义:Swing是在原有的AWT的基础上进行了补充和改进,提供了更加丰富的组件和功能,来满足GUI设计的一切需求。 说明: Swing是一种轻量级组件,它由Java语言开发,同时底层以AWT为基础。 同AWT相比,在实际开发中,更多的是使用Swing进行图形用户界面开发。 Swing组件为实现图形用户界面提供了很多基础类库,多数位于java.awt、javax.swing包及其子包下。 ===== 第 13 页 ===== 8.1 Swing概述 Swing组件继承关系: ===== 第 14 页 ===== 8.1 Swing概述 说明: Swing组件的所有类都继承自Container类,然后根据GUI开发的功能扩展了2个主要分支:容器分支(包括Window窗口和Panel面板)和组件分支。 容器分支就是为了实现图形用户界面窗口容器而设计的。 组件分支则是为了实现向容器中填充数据、元素以及人机交互组件等功能。 Swing组件类中,常用的顶级容器类包括有JApplet、JFrame和JDialog。 常用组件AbstractButton类及其子类是用来定义按钮常见行为的工具类。 JTextComponent类及其子类就是用来定义文本内容编辑区域的工具类。 ===== 第 15 页 ===== 8.2 Swing顶级容器 8.2.1 JFrame 说明: 在Swing组件中,最常见的一个容器就是JFrame。 JFrame是一个独立存在的顶级容器(也叫窗口),不能放置在其他容器之中。 JFrame支持通用窗口所有的基本功能,例如窗口最小化、设定窗口大小等。 ===== 第 16 页 ===== 示例: private static void createAndShowGUI() { // 创建并设置JFrame容器窗口 JFrame frame = new JFrame("JFrameTest"); // 设置关闭窗口时的默认操作 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(250, 150); // 设置窗口尺寸 frame.setVisible(true); // 展示JFrame容器窗口 } public static void main(String[] args) { //使用SwingUtilities工具类调用createAndShowGUI()方法显示GUI程序 SwingUtilities.invokeLater(Example01::createAndShowGUI); } 8.2 Swing顶级容器 ===== 第 17 页 ===== 8.2 Swing顶级容器 结果: 说明: 示例通过JFrame类创建了一个窗体,并指定窗体对象标题为“JFrameTest”。 通过JFrame类的相关方法分别设置了窗体对象关闭时的操作、窗体尺寸大小以及窗体信息可见。 在main()方法中,使用了javax.swing包下中SwingUtilities(封装有一系列操作Swing的方法集合工具类)工具类的invokeLater()方法执行了GUI程序。 8.2.1 JFrame ===== 第 18 页 ===== 8.2 Swing顶级容器 8.2.2 JDialog 说明: JDialog是Swing的另外一个顶级容器,通常用来表示对话框窗口。 JDialog对话框可分为两种:模态对话框和非模态对话框。 是指用户需要等到处理完对话框后才能继续与其他窗口交互。 模态对话框 是指允许用户在处理对话框的同时与其他窗口交互。 非模态对话框 VS ===== 第 19 页 ===== 8.2 Swing顶级容器 8.2.2 JDialog 说明:对话框是模态或者非模态,可以在创建JDialog对象时为构造方法传入参数来设置,也可以在创建JDialog对象后调用它的setModal()方法来进行设置。 常用构造方法: 方法声明 | 功能描述 JDialog(Frame owner) | 构造方法,用来创建一个非模态的对话框,owner为对话框所有者(顶级窗口JFrame) JDialog(Frame owner,String title) | 构造方法,创建一个具有指定标题的非模态对话框 JDialog(Frame owner,boolean modal) | 创建一个有指定模式的无标题对话框,默认值false(即非模态对话框) ===== 第 20 页 ===== 示例: private static void createAndShowGUI() { JFrame frame = new JFrame("JFrameTest"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(350, 150); frame.setVisible(true); JDialog dialog = new JDialog(frame, "JDialog对话框",true); dialog.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE); dialog.setSize(200, 100); dialog.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(Example02::createAndShowGUI); } 8.2 Swing顶级容器 ===== 第 21 页 ===== 8.2 Swing顶级容器 结果: 说明: 虽然JFrame和JDialog都可以创建顶级容器窗口,但JDialog创建的窗口右上角没有放大和缩小功能。 由于创建JDialog容器对象时,设置的模态参数modal为true,所以在操作时,必须先关闭JDialog对话框后才可以与JFrame窗口进行交互。 8.2.2 JDialog ===== 第 22 页 ===== 8.3 布局管理器 说明:Swing组件不能单独存在,必须放置于容器当中,而组件在容器中的位置和尺寸是由布局管理器来决定的。 分类: GridBagLayout(网格包布局管理器) 5 GridLayout(网格布局管理器) 6 GroupLayout(分组布局管理器) 7 SpringLayout(弹性布局管理器) 8 BorderLayout(边界布局管理器) 1 BoxLayout(箱式布局管理器) 2 CardLayout(卡片布局管理器) 3 FlowLayout(流式布局管理器) 4 ===== 第 23 页 ===== 8.3 布局管理器 8.3.1 BorderLayout 说明: BorderLayout(边界布局管理器)是一种较为复杂的布局方式,它将容器划分为五个区域,分别是页头(PAGE_START)、页尾(PAGE_END)、行首(LINE_START)、行尾(LINE_END)、中部(CENTER)。 组件可以被放置在这五个区域中的任意一个位置。 官方布局效果图: ===== 第 24 页 ===== 8.3 布局管理器 8.3.1 BorderLayout 使用: 向BorderLayout布局管理器的容器中添加组件时,需要使用add(Component comp,Object constraints)方法。 参数comp表示要添加的组件,constraints指定将组件添加到布局中的位置,它是一个Object类型。 传参时可以使用BorderLayout类提供的5个常量设置组件位置,它们分别是PAGE_START、PAGE_END、LINE_START、LINE_END和CENTER。 ===== 第 25 页 ===== 8.3 布局管理器 8.3.1 BorderLayout 说明: BorderLayout的好处就是可以限定各区域的边界,当用户改变容器窗口大小时,各个组件的相对位置不变。 向BorderLayout的布局管理器添加组件时,如果不指定添加到哪个区域,则默认添加到CENTER区域。 每个区域只能放置一个组件,如果向一个区域中添加多个组件时,后放入的组件会覆盖先放入的组件。 案例演示(参考教材文件8-3) ===== 第 26 页 ===== 8.3 布局管理器 小提示 在使用BorderLayout边界布局管理器过程中,当使用add(Component comp,Object constraints)方法向容器区域中添加指定组件和位置时,除了可以使用前面介绍的PAGE_START、PAGE_END、LINE_START、LINE_END和CENTER常量参数指定组件位置,也可以使用NORTH、SOUTH、EAST、WEST和CENTER常量参数来指定组件位置,只不过在文件8-3中使用的常量参数是JDK 1.4版本开始出现的,适合不同语言标准,也是官方相对推荐的。 ===== 第 27 页 ===== 8.3 布局管理器 8.3.2 FlowLayout 说明: FlowLayout(流式布局管理器)是最简单的布局管理器。 在这种布局下,容器会将组件按照添加顺序从左向右放置,当到达容器的边界时,会自动将组件放到下一行的开始位置。 这些组件可以按左对齐、居中对齐(默认方式)或右对齐的方式排列。 ===== 第 28 页 ===== 8.3 布局管理器 构造方法: 说明: 参数align决定组件在每行中相对于容器边界的对齐方式,分别为左对齐、右对齐、居中对齐。 对齐方式可以使用该类中提供的常量FlowLayout.LEFT、FlowLayout.RIGHT、FlowLayout.CENTER表示。 参数hgap和参数vgap分别设定组件之间的水平和垂直间距,可以填入一个任意数值。 方法声明 | 功能描述 FlowLayout() | 组件默认居中对齐,水平、垂直间距默认为5个单位 FlowLayout(int align) | 指定组件相对于容器的对齐方式,水平、垂直间距默认为5个单位 FlowLayout(int align,int hgap,int vgap) | 指定组件的对齐方式和水平、垂直间距 ===== 第 29 页 ===== 8.3 布局管理器 8.3.2 FlowLayout 效果: 案例演示(参考教材文件8-4) ===== 第 30 页 ===== 8.3 布局管理器 8.3.3 GridLayout 说明: GridLayout(网格布局管理器)使用纵横线将容器分成n行m列大小相等的网格,每个网格中可以添加一个组件。 添加到容器中的组件会从左向右、从上向下依次填充到网格中。 与FlowLayout不同的是,放置在GridLayout布局管理器中的组件将自动占据网格的整个区域 ===== 第 31 页 ===== 8.3 布局管理器 构造方法: 说明:参数rows代表行数,cols代表列数,hgap和vgap规定窗格之间水平和垂直方向的间距。 方法声明 | 功能描述 GridLayout() | 默认只有一行,每个组件占一列 GridLayout(int rows,int cols) | 指定容器的行数和列数 GridLayout(int rows,int cols,int hgap,int vgap) | 指定容器的行数和列数以及组件之间的水平、垂直间距 ===== 第 32 页 ===== 8.3 布局管理器 8.3.3 GridLayout 效果: 案例演示(参考教材文件8-5) 特点:组件的相对位置不随区域的缩放而改变,但组件的大小会随之改变,组件始终占据网格的整个区域。 缺点:总是忽略组件的最佳大小,所有组件的宽高都相同。 ===== 第 33 页 ===== 8.4 事件处理 8.4.1 事件处理机制 定义:Swing组件中的事件处理专门用于响应用户的操作,例如,响应用户的单击鼠标、按下键盘等操作。 Swing事件处理涉及的三类对象: 事件源 (Event Source) 监听器 (Listener) 事件对象 (Event) 事件发生的场所,通常就是产生事件的组件,例如窗口、按钮、菜单等。 封装了GUI组件上发生的特定事件(通常就是用户的一次操作)。 负责监听事件源上发生的事件,并对各种事件做出相应处理的对象(对象中包含事件处理器)。 ===== 第 34 页 ===== 8.4 事件处理 8.4.1 事件处理机制——事件处理流程 说明:事件源是一个组件,当用户进行一些操作时,如按下鼠标或者释放键盘等,都会触发相应的事件,如果事件源注册了监听器,则触发的相应事件将会被处理。 外部 动作 事件源(组件) 监听器(含处理器) 事件对象 1、将监听器注册到事件源 2、触发事件源上的事件 3、产生并传递事件对象 4、接收事件对象,激活事件处理器,实现预定功能 ===== 第 35 页 ===== 8.4 事件处理 8.4.1 事件处理机制 效果: 案例演示(参考教材文件8-6) ===== 第 36 页 ===== 8.4 事件处理 8.4.1 事件处理机制——主要步骤 1、创建事件源 2、自定义事件监听器 3、为事件源注册监听器 除了一些常见的按钮、键盘等组件可以作为事件源外,包括JFrame窗口在内的顶级容器也可以作为事件源; 根据要监听的事件源创建指定类型的监听器进行事件处理,该监听器是一个特殊的Java类,必须实现XxxListener接口(根据组件触发的动作进行区分,如WindowListener用于监听窗口事件,ActionListener用于监听动作事件); 使用addXxxListener()方法为指定事件源添加特定类型的监听器。当事件源上发生监听的事件后,就会触发绑定的事件监听器,然后由监听器中的方法进行相应处理。 ===== 第 37 页 ===== 8.4 事件处理 8.4.2 Swing常用事件处理 鼠标事件(MouseEvent) 2 键盘事件(KeyEvent) 3 动作事件(ActionEvent) 4 窗体事件(WindowEvent) 1 主要事件分类 ===== 第 38 页 ===== 8.4 事件处理 说明: 对窗体进行操作时,例如窗体的打开、关闭、激活、停用等,这些动作都属于窗体事件。 Java中提供了一个WindowEvent类用于表示窗体事件。 使用: 首先需要定义一个实现了WindowListener接口的类作为窗体监听器; 然后通过addWindowListener()方法将窗体对象与窗体监听器进行绑定。 窗体事件 ===== 第 39 页 ===== 8.4 事件处理 效果: 案例演示(参考教材文件8-7) 窗体事件 分别执行最小化、单击任务栏图标、单击关闭按钮时 ===== 第 40 页 ===== 8.4 事件处理 说明: 用户会经常使用鼠标来进行选择、切换界面等操作,这些操作被定义为鼠标事件,其中包括鼠标按下、鼠标松开、鼠标单击等。 Java中提供了一个MouseEvent类用于表示鼠标事件。 几乎所有的组件都可以产生鼠标事件。 使用: 首先需要通过实现MouseListener接口定义监听器(也可以通过继承适配器MouseAdapter类来实现); 然后调用addMouseListener()方法将监听器绑定到事件源对象。 鼠标事件 ===== 第 41 页 ===== 8.4 事件处理 效果: 案例演示(参考教材文件8-8) 先把鼠标移进按钮区域,接着单击按钮然后释放,再移出按钮区域 鼠标事件 ===== 第 42 页 ===== 8.4 事件处理 说明:MouseEvent类中定义了很多常量来识别鼠标动作。 MouseEvent.BUTTON1:用来判定鼠标左击事件; MouseEvent.BUTTON3:用来判定鼠标右击事件; MouseEvent.BUTTON2:用来判定鼠标滚轮点击事件; 鼠标事件 ===== 第 43 页 ===== 8.4 事件处理 说明: 键盘操作也是最常用的用户交互方式,例如键盘按下、释放等,这些操作被定义为键盘事件。 Java中提供了一个KeyEvent类表示键盘事件。 使用: 处理键盘事件的监听器对象需要实现KeyListener接口或者继承KeyAdapter类; 然后调用addKeyListener()方法将监听器绑定到事件源对象。 键盘事件 ===== 第 44 页 ===== 8.4 事件处理 效果: 案例演示(参考教材文件8-9) 在窗口中,依次输入键盘上的a、s、1字符 键盘事件 ===== 第 45 页 ===== 8.4 事件处理 说明: 动作事件与前面三种事件有所不同,它不代表某类事件,只是表示一个动作发生了。 例如,在关闭一个文件时,可以通过键盘关闭,也可以通过鼠标关闭。 在Java中,动作事件用ActionEvent类表示。 使用:处理动作事件的监听器对象需要实现ActionListener接口。 动作事件 ===== 第 46 页 ===== 8.5 Swing常用组件 说明:Swing组件中供了一些面板组件(中间容器),这些面板组件不能单独存在,只能放置在顶级窗口容器中。 常见组件: 8.5.1 面板组件 JPanel JScrollPane JPanel面板组件是一个无边框,不能被移动、放大、缩小或者关闭的面板,它的默认布局管理器是FlowLayout。 JScrollPane是一个带有滚动条的面板容器,且只能添加一个组件; 想向JScrollPane面板中添加多个组件,应先将这多个组件添加到某个组件中,然后再将这个组件添加到JScrollPane中。 ===== 第 47 页 ===== 8.5 Swing常用组件 说明:第三个构造方法,是在第二个构造方法的基础上指定滚动条策略。如果在构造方法中没用指定显示组件和滚动条策略,也可以使用JScrollPane提供的方法进行设置。 8.5.1 面板组件——JScrollPane常用构造方法 方法声明 | 功能描述 JScrollPane() | 创建一个空的JScrollPane面板 JScrollPane(Component view) | 创建一个显示指定组件的JScrollPane面板,只要组件的内容超过视图大小就会显示水平和垂直滚动条 JScrollPane(Component view, int vsbPolicy,int hsbPolicy) | 创建一个显示指定容器、并具有指定滚动条策略的JScrollPane。参数vsbPolicy和hsbPolicy分别表示垂直滚动条策略和水平滚动条策略 ===== 第 48 页 ===== 8.5 Swing常用组件 说明: 上述表格方法是JScrollPane滚动面板组件对象提供的设置滚动策略的方法。 滚动策略方法取值可以使用ScrollPaneConstants接口中声明了多个常量属性来进行设置。 8.5.1 面板组件——JScrollPane设置面板滚动策略的方法 方法声明 | 功能描述 void setHorizontalBarPolicy(int policy) | 指定水平滚动条策略,即水平滚动条何时显示在滚动面板上 void setVerticalBarPolicy(int policy) | 指定垂直滚动条策略,即垂直滚动条何时显示在滚动面板上 void setViewportView(Component view) | 设置在滚动面板显示的组件 ===== 第 49 页 ===== 8.5 Swing常用组件 8.5.1 面板组件——JScrollPane滚动策略常量值 常量属性 | 功能描述 VERTICAL_SCROLLBAR_AS_NEEDED HORIZONTAL_SCROLLBAR_AS_NEEDED | 当填充的组件视图超过客户端窗口大小时,自动显示水平和竖直放行滚动条(JscrollPane组件的默认值) VERTICAL_SCROLLBAR_ALWAYS HORIZONTAL_SCROLLBAR_ALWAYS | 无论填充的组件视图大小,始终显示水平和竖直放行滚动条 VERTICAL_SCROLLBAR_NEVER HORIZONTAL_SCROLLBAR_NEVER | 无论填充的组件视图大小,始终不显示水平和竖直放行滚动条 ===== 第 50 页 ===== 8.5 Swing常用组件 效果: 案例演示(参考教材文件8-10) 8.5.1 面板组件 ===== 第 51 页 ===== 8.5 Swing常用组件 定义:文本组件用于接收用户输入的信息,包括文本框(JTextField)、文本域(JTextArea)等。 说明:它们都有一个共同父类JTextComponent,JTextComponent是一个抽象类。 常用方法: 8.5.2 文本组件 方法声明 | 功能描述 String String getText() | 返回文本组件中所有的文本内容 String getSelectedText() | 返回文本组件中选定的文本内容 void selectAll() | 在文本组件中选中所有内容 void setEditable() | 设置文本组件为可编辑或者不可编辑状态 void setText(String text) | 设置文本组件的内容 void replaceSelection(String content) | 用给定的内容替换当前选定的内容 ===== 第 52 页 ===== 8.5 Swing常用组件 定义:JTextField称为文本框,它只能接收单行文本的输入。 常用构造方法: 8.5.2 文本组件——JTextField 方法声明 | 功能描述 JTextField() | 创建一个空的文本框,初始字符串为null JTextFiled(int columns) | 创建一个具有指定列数的文本框,初始字符串为null JTextField(String text) | 创建一个显示指定初始字符串的文本框 JTextField(String text,int column) | 创建一个具有指定列数、并显示指定初始字符串的文本框 说明: JTextField有一个子类JPasswordField,表示一个单行输入密码框。 在此框中是通过显示指定的回显字符作为占位符。 新创建的密码框默认的回显字符为“*”。 ===== 第 53 页 ===== 8.5 Swing常用组件 定义:JTextArea称为文本域,它能接收多行文本的输入,使用JTextArea构造方法创建对象时可以设定区域的行数、列数。 常用构造方法: 8.5.2 文本组件——JTextArea 方法声明 | 功能描述 JTextArea() | 构造方法,创建一个空的文本域 JTextArea(String text) | 构造方法,创建显示指定初始字符串的文本域 JTextArea(int rows,int columns) | 构造方法,创建具有指定行和列的空的文本域 JTextArea(String text,int rows,int columns) | 构造方法,创建显示指定初始文本并指定了行列的文本域 ===== 第 54 页 ===== 8.5 Swing常用组件 效果: 案例演示(参考教材文件8-11) 8.5.2 文本组件 在聊天窗口中输入聊天信息,并单击【发送】按钮 ===== 第 55 页 ===== 8.5 Swing常用组件 定义:Swing中提供了用于仅供展示的标签组件。 说明:标签组件主要用到的是JLabel,JLabel组件可以显示文本、图像,还可以设置标签内容的垂直和水平对齐方式。 构造方法: 8.5.3 标签组件 方法声明 | 功能描述 JLabel() | 创建无图像并且其标题为空字符串的JLabel JLabel(Icon image) | 创建具有指定图像的JLabel实例 JLabel(Icon image, int horizontalAlignment) | 创建具有指定图像和水平对齐方式的JLabel实例 JLabel(String text) | 创建具有指定文本的JLabel实例 JLabel(String text, Icon icon, int horizontalAlignment) | 创建具有指定文本、图像和水平对齐方式的 JLabel 实例 JLabel(String text, int horizontalAlignment) | 创建具有指定文本和水平对齐方式的 JLabel 实例 ===== 第 56 页 ===== 8.5 Swing常用组件 效果: 案例演示(参考教材文件8-12) 8.5.3 标签组件 ===== 第 57 页 ===== 8.5 Swing常用组件 说明:在Swing中常见的按钮组件有JButton、JCheckBox、JRadioButton等,它们都是抽象类AbstractButton类的直接或间接子类。 AbstractButton常用方法: 8.5.4 按钮组件 方法声明 | 功能描述 Icon getIcon() | 获取按钮的图标 void setIcon(Icon icon) | 设置按钮的图标 String getText() | 获取按钮的文本 void setText(String text) | 设置按钮的文本 void setEnable(boolean b) | 设置按钮是否可用 boolean setSelected(boolean b) | 设置按钮是否为选中状态 boolean isSelected() | 返回按钮的状态(true为选中,反之为未选中) ===== 第 58 页 ===== 8.5 Swing常用组件 说明:JCheckBox组件被称为复选框组件,它有选中和未选中两种状态,通常复选框会有多个,用户可以选中其中一个或者多个。 常用构造方法: 8.5.4 按钮组件——JCheckBox 方法声明 | 功能描述 JCheckBox() | 创建一个没有文本信息,初始状态未被选中的复选框 JCheckBox(String text) | 创建一个带有文本信息,初始状态未被选定的复选框 JCheckBox(String text,boolean selected) | 创建一个带有文本信息,并指定初始状态(选中/未选中)的复选框 说明:除了上述构造方法,还可以调用从父类继承的setText(String text)来设置复选框文本信息,调用setSelected(boolean b)方法来设置复选框状态(是否被选中),也可以调用isSelected()方法来判断复选框是否被选中。。 ===== 第 59 页 ===== 8.5 Swing常用组件 效果: 案例演示(参考教材文件8-13) 8.5.4 按钮组件——JCheckBox 未勾选 勾选一个 勾选两个 ===== 第 60 页 ===== 8.5 Swing常用组件 说明:JRadioButton组件被称为单选按钮组件,单选按钮只能选中一个。 使用: 要JRadioButton按钮之间的互斥,需要使用ButtonGroup类。 ButtonGroup是一个不可见的单选按钮组。将多个JRadioButton按钮添加到同一个单选按钮组中就能实现JRadioButton按钮的单选功能。 常用构造方法: 8.5.4 按钮组件——JRadioButton 方法声明 | 功能描述 JRadioButton () | 创建一个没有文本信息、初始状态未被选中的单选框 JRadioButton (String text) | 创建一个带有文本信息、初始状态未被选定的单选框 JRadioButton (String text,boolean selected) | 创建一个具有文本信息,并指定初始状态(选中/未选中)的单选框。 ===== 第 61 页 ===== 8.5 Swing常用组件 效果: 案例演示(参考教材文件8-14) 8.5.4 按钮组件——JRadioButton 未勾选 勾选第一个 勾选第二个 ===== 第 62 页 ===== 8.5 Swing常用组件 定义: JComboBox组件被称为下拉框或者组合框,它将所有选项折叠在一起,默认显示的是第一个添加的选项。 当用户单击下拉框时,会出现下拉式的选择列表,用户可以从中选择其中一项并显示。 8.5.5 下拉框组件 ===== 第 63 页 ===== 8.5 Swing常用组件 说明: JComboBox下拉框组件分为可编辑和不可编辑两种形式。 对于不可编辑的下拉框,用户只能选择现有的选项列表。 对于可编辑的下拉框,用户既可以选择现有的选项列表,也可以自己输入新的内容。 注意:自己输入的内容只能作为当前项显示,并不会添加到下拉框的选项列表中。 8.5.5 下拉框组件 ===== 第 64 页 ===== 8.5 Swing常用组件 8.5.5 下拉框组件 方法声明 | 功能描述 JComboBox() | 创建一个没有可选项的下拉框 JComboBox(Object[] items) | 创建一个下拉框,将Object数组中的元素作为下拉框的下拉列表选项 JComboBox(Vector items) | 创建一个下拉框,将Vector集合中的元素作为下拉框的下拉列表选项 JComboBox常用构造方法: ===== 第 65 页 ===== 8.5 Swing常用组件 8.5.5 下拉框组件 JComboBox常用方法: 方法声明 | 功能描述 void addItem(Object anObject) | 为下拉框添加选项 void insertItemAt(Object anObject,int index) | 在指定的索引处插入选项 Objct getItemAt(int index) | 返回指定索引处选项,第一个选项的索引为0 int getItemCount() | 返回下拉框中选项的数目 Object getSelectedItem() | 返回当前所选项 void removeAllItems() | 删除下拉框中所有的选项 void removeItem(Object object) | 从下拉框中删除指定选项 void removeItemAt(int index) | 移除指定索引处的选项 void setEditable(boolean aFlag) | 设置下拉框的选项是否可编辑,aFlag为true则可编辑,反之则不可编辑 ===== 第 66 页 ===== 8.5 Swing常用组件 效果: 案例演示(参考教材文件8-15) 8.5.5 下拉框组件 在下拉框中选中某个选项 ===== 第 67 页 ===== 8.5 Swing常用组件 说明: 计算机中很多文件的菜单都是下拉式的,如记事本的菜单。 在Swing中,创建下拉式菜单需要使用三个组件:JMenuBar(菜单栏)、JMenu(菜单)和JMenuItem(菜单项)。 图示(以记事本为例): 8.5.6 菜单组件——下拉式菜单 ===== 第 68 页 ===== 8.5 Swing常用组件 JMenuBar表示一个水平的菜单栏,它用来管理一组菜单,不参与同用户的交互式操作。 菜单栏可以放在容器的任何位置,但通常情况下会使用顶级容器(如JFrame、Jdialog)的setJMenuBar()方法将它放置在顶级容器的顶部。 创建菜单栏时,只需要使用new关键字创建JMenubar对象即可。 创建完菜单栏对象后,可以调用它的add(JMenu c)方法为其添加JMenu菜单。 JMenuBar(菜单栏) ===== 第 69 页 ===== 8.5 Swing常用组件 JMenu表示一个菜单,它用来整合管理菜单项。 菜单可以是单一层次的结构,也可以是多层次的结构。 大多情况下,会使用JMenu(String text)构造函数创建JMenu菜单,参数text表示菜单上的文本内容。 JMenu(菜单) ===== 第 70 页 ===== 8.5 Swing常用组件 JMenu(菜单)——常用方法 方法声明 | 功能描述 JMenuItem add(JMenuItem menuItem) | 将菜单项添加到菜单末尾,返回此菜单项 void addSeparator() | 将分隔符添加到菜单的末尾 JMenuItem getItem(int pos) | 返回指定索引处的菜单项,第一个菜单项的索引为0 int getItemCount() | 返回菜单上的项数,菜单项和分隔符都计算在内 JMenuItem insert(JmenuItem menuItem,int pos) | 在指定索引处插入菜单项 void insertSeparator(int pos) | 在指定索引处插入分隔符 void remove(int pos) | 从菜单中移除指定索引处的菜单项 void remove(JMenuItem menuItem) | 从菜单中移除指定的菜单项 void removeAll() | 从菜单中移除所有的菜单项 ===== 第 71 页 ===== 8.5 Swing常用组件 JMenuItem表示一个菜单项,它是菜单系统中最基本的组件。 通常会使用JMenumItem(String text)这个构造方法为菜单项指定文本内容。 JMenuItem继承自AbstractButton类,因此可以把它看成是一个按钮。 如果使用无参的构造方法创建了一个菜单项,则可以调用从AbstractButton类中继承的setText(String text)方法和setIcon()方法为其设置文本和图标。 JMenuItem(菜单项) ===== 第 72 页 ===== 8.5 Swing常用组件 效果: 案例演示(参考教材文件8-16) 8.5.6 菜单组件——下拉式菜单 ===== 第 73 页 ===== 8.5 Swing常用组件 说明: 例如在Windows桌面单击鼠标右键会出现一个菜单,这就是弹出式菜单。 在Swing组件中,弹出式菜单可以用JPopupMenu来实现。 使用: JPopupMenu弹出式菜单同样通过调用add()方法添加JMenuItem菜单项,但它默认是不可见的。 想要显示弹出式菜单,必须调用show(Component invoker,int x,int y)方法。参数invoker表示JPopupMenu菜单显示位置的参考组件,x和y表示invoker组件坐标空间中的一个坐标,显示的是JPopupMenu菜单的左上角坐标。 8.5.6 菜单组件——弹出式菜单 ===== 第 74 页 ===== 8.5 Swing常用组件 效果: 案例演示(参考教材文件8-17) 8.5.6 菜单组件——弹出式菜单 ===== 第 75 页 ===== 8.6 Swing组件的整合使用 任务案例 案例代码 接下来,通过一个模拟QQ登录的案例来熟悉Swing的综合使用。请查看教材8.6小节。 ===== 第 76 页 ===== 8.7 JavaFX图形用户界面工具 什么是JavaFX? 定义:JavaFX同Swing一样,都用于处理图形用户界面。 说明: JavaFX是一个强大的图形和多媒体处理工具包集合。 它允许开发者来设计、创建、测试、调试和部署富客户端程序(Rich Client Applications)。 JavaFX和Java一样具有跨平台特性。 ===== 第 77 页 ===== 8.7 JavaFX图形用户界面工具 8.7.1 JavaFX概述——核心版本发展 1 2 3 JavaFX 1.0:使用JavaFX Script的静态、声明式的编程语言来开发JavaFX应用程序。 JavaFX 2.0:之后的版本摒弃了JavaFX Script语言,而是作为一个Java API来使用。同时该版本包含非常丰富的UI控件、图形和多媒体特性用于简化可视化应用的开发。 JavaFX 8:从JDK 7u6开始,JavaFX就与JDK捆绑使用,并结合JDK 8的新增特性,直接将其新版本定为JavaFX 8。JavaFX 8版本进一步增加了多种功能,如动画、3D效果等。 ===== 第 78 页 ===== JavaFX 8 主要特性 8.7 JavaFX图形用户界面工具 8.7.1 JavaFX概述 支持Java API直接调用 提供WebView组件,实现Web页面嵌入 支持与Swing互操作 内嵌UI控件和CSS样式 支持3D图形处理能力 可以使用FXML和Scene Builder设计图形用户界面 ===== 第 79 页 ===== 8.7 JavaFX图形用户界面工具 8.7.2 JavaFX开发环境配置 说明: 从JDK 7u6才开始包含JavaFX类库,并且最新比较稳定的JavaFX完全结合了JDK 8的特性。 要运行JavaFX应用程序,建议在系统中安装JDK 8或更高版本,否则,使用低版本的JDK还需要额外导入jfxrt.jar等包。 IDE(如Eclipse、NetBeans、IntelliJ IDEA)也为JavaFX提供了支持,在使用这些IDE工具进行JavaFX开发时,需要进行相应配置。 在使用Eclipse进行JavaFX开发时,除了所依赖的JDK 8,还需要用到一个名为e(fx)clipse的插件,该插件是JavaFX开发所需的工具库。 ===== 第 80 页 ===== 8.7 JavaFX图形用户界面工具 8.7.2 JavaFX开发环境配置——Eclipse中安装配置e(fx)clipse插件 (1)打开Eclipse工具,选中并打开“Help”菜单栏下拉列表中的“Install New Software…”选项,如图所示。 ===== 第 81 页 ===== 8.7 JavaFX图形用户界面工具 8.7.2 JavaFX开发环境配置——Eclipse中安装配置e(fx)clipse插件 (2)在打开的弹窗中,单击【Add...】按钮,在新出现的“Add Repository”窗口中,分别输入需要安装的插件名称和地址,然后单击【OK】按钮,如图所示。 【注意】 图中在Eclipse 4.6版本上安装e(fx)clipse插件,e(fx)clipse插件链接地址版本为2.4.0,必须与Eclipse版本匹配,否则安装过程中可能会出现所需版本软件不存在的错误。 ===== 第 82 页 ===== 8.7 JavaFX图形用户界面工具 8.7.2 JavaFX开发环境配置——Eclipse中安装配置e(fx)clipse插件 (3)添加完e(fx)clipse插件的配置信息后,在“Install”窗口中选中出现的两个复选框选项,如图所示。 接着依次单击【Next】按钮,直到弹出“Review Licenses”窗口界面,在该界面中选中“I accept the terms of the license agreement”选项,单击【Finish】按钮即可进入插件安装状态,安装完成后根据提示重启Eclipse即可。 ===== 第 83 页 ===== 8.7 JavaFX图形用户界面工具 8.7.2 JavaFX开发环境配置——Eclipse中安装配置e(fx)clipse插件 (4)重启Eclipse后,依次选择“File”->“New”->“Ohter...”会出现“Select a wizard”弹窗,展示JavaFX插件信息,说明e(fx)clipse插件安装成功,如图所示。 ===== 第 84 页 ===== 8.7 JavaFX图形用户界面工具 8.7.3 JavaFX基础入门 (1)创建JavaFX项目。打开Eclipse,并在Eclipse中依次选择“File”->“New”->“Others..”->“JavaFX Project”选项,创建一个名称为“javaFX”的项目,项目创建成功后,如图所示。 JavaFX项目默认创建的程序的入口文件, 内部初始化了一个空白图形界面 JavaFX项目默认创建的CSS样式文件 ===== 第 85 页 ===== 8.7 JavaFX图形用户界面工具 8.7.3 JavaFX基础入门 (2)编辑Main.java文件。 public class Main extends Application { public void start(Stage stage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("fxml_example.fxml")); Scene scene = new Scene(root, 300, 275); stage.setTitle("FXML Welcome"); stage.setScene(scene); stage.show(); // 将图形界面窗口设置为可见 } public static void main(String[] args) { launch(args); // 通过Application抽象类的launch()方法启动程序 } } ===== 第 86 页 ===== 8.7 JavaFX图形用户界面工具 8.7.3 JavaFX基础入门 (3)创建fxml_example.fxml文件。在Main.java文件同级目录下依次选择“File”->“New”->“Others..”->“New FXML Document”选项,创建一个名称为“fxml_example”的fxml格式文件(详见教材文件8-22所示)。 ... ... ===== 第 87 页 ===== 8.7 JavaFX图形用户界面工具 8.7.3 JavaFX基础入门 (4)创建并编辑FXMLExampleController.java文件。在Main.java文件同级目录下创建一个名为FXMLExampleController的事件处理类,并编写事件处理方法。 public class FXMLExampleController { // 与fxml_example.fxml文件中的登录提示框fx:id一致 @FXML private Text actiontarget; // 为fxml_example.fxml文件中的登录按钮编写事件处理 @FXML protected void handleSubmitButtonAction(ActionEvent event) { actiontarget.setText("点击了登录按钮"); } } ===== 第 88 页 ===== 8.7 JavaFX图形用户界面工具 8.7.3 JavaFX基础入门 (4)完成上述4步操作后,运行主程序Main类,结果如图所示。 ===== 第 89 页 ===== 8.7 JavaFX图形用户界面工具 8.7.3 JavaFX基础入门 (5)为fxml_example.fxml图形布局文件引入外联的CSS样式文件(详见教材8.7.3小节第5步)。 (6)编辑application.css样式文件。打开application.css样式文件,为图8-37所示的JavaFX图形用户接口项目编写CSS样式(详见教材文件8-24)。 ===== 第 90 页 ===== 8.7 JavaFX图形用户界面工具 8.7.3 JavaFX基础入门 (6)当编写完并引入application.css样式文件成功后,再次启动主程序入口Main类中的main()方法,结果如图所示。 ===== 第 91 页 ===== 8.7 JavaFX图形用户界面工具 JavaFX Scene Builder是什么? 说明:JavaFX Scene Builder是一种可视布局管理工具,允许用户快速设计JavaFX应用程序用户界面,而无需编码。 使用: 用户可以将UI组件拖放到工作区,修改其属性、应用样式表。 创建的布局会在后台自动生成一个结果为FXML格式的文件。 想在Eclipse中使用JavaFX Scene Builder工具,就必须先进行配置,在配置之前要先保证Eclipse安装了e(fx)clipse插件。 ===== 第 92 页 ===== 8.7 JavaFX图形用户界面工具 8.7.4 JavaFX可视化管理工具——JavaFX Scene Builder工具的下载与安装 (1)下载JavaFX Scene Builder。进入http://www.oracle.com/technetwork/java/javase/downloads/javafxscenebuilder-1x-archive-2199384.html下载页面,选择对应平台的版本进行下载,这里以JavaFX Scene Builder2版本为例,如图所示。 ===== 第 93 页 ===== 8.7 JavaFX图形用户界面工具 8.7.4 JavaFX可视化管理工具——JavaFX Scene Builder工具的下载与安装 (2)安装JavaFX Scene Builder。下载完成后,会得到一个javafx_scenebuilder-2_0-windows.msi安装文件,直接双击文件进行安装,安装过程中可以通过【更改(C)...】按钮来更改安装目录,如图所示。 ===== 第 94 页 ===== 8.7 JavaFX图形用户界面工具 8.7.4 JavaFX可视化管理工具——JavaFX Scene Builder工具的下载与安装 (3)在Eclipse中配置JavaFX Scene Builder。在Eclipse中,打开Window菜单下的“Preferences”选项窗口,找到JavaFX的配置位置,在右侧窗口中通过【Browse...】按钮配置安装的JavaFX Scene Builder工具位置,最后单击【OK】按钮即可,如图所示。 ===== 第 95 页 ===== 8.7 JavaFX图形用户界面工具 8.7.4 JavaFX可视化管理工具——JavaFX Scene Builder工具的基本使用 (1)创建test.fxml文件。在javaFX项目的application目录下创建一个名为test.fxml的fxml格式文件,鼠标右键选中并使用“Open with SceneBuilder”选项打开,结果如图所示。 ===== 第 96 页 ===== 8.7 JavaFX图形用户界面工具 8.7.4 JavaFX可视化管理工具——JavaFX Scene Builder工具的基本使用 (2)先用鼠标选中中间区域的AnchorPane面板组件(打开fxml文件时默认的面板组件),将该组件拉伸至合适大小,接着在左上角区域选择Lable组件拖拽至AnchorPane面板组件内,并在右边组件属性设置区域对该Lable组件进行简单设置,结果如图所示。 ===== 第 97 页 ===== 8.7 JavaFX图形用户界面工具 8.7.4 JavaFX可视化管理工具——JavaFX Scene Builder工具的基本使用 (2)接着,可以参考上述方式再次添加其他组件,如输入框、密码、登录按钮等,结果如图所示。 说明:完成需求组件的设计后,可以直接保存并关闭该窗口,此时通过可视化工具设计的布局文件代码会在自动生成到test.fxml文件中。 ===== 第 98 页 ===== 8.7 JavaFX图形用户界面工具 8.7.4 JavaFX可视化管理工具——JavaFX Scene Builder工具的基本使用 (3)为了验证JavaFX Scene Builder工具的设计效果,可以对文件8-21所示的Main.java文件中第8~9行代码进行修改,引入test.fxml布局文件。 Parent root = FXMLLoader.load(getClass().getResource("test.fxml")); ===== 第 99 页 ===== 8.7 JavaFX图形用户界面工具 8.7.4 JavaFX可视化管理工具——JavaFX Scene Builder工具的基本使用 (3)然后,再次启动主程序入口Main类,结果如图所示。 ===== 第 100 页 ===== GUI是本教材中相对独立的一章内容,本章主要针对Java中比较流行的两种GUI图形用户工具分两部分进行阐述,向初学者讲解了GUI的一些基本原理、开发技巧和思想。第一部分,主要讲解了Swing图形用户工具的组件架构、顶级容器、布局管理器、事件处理以及一些常用的组件,并通过一个模拟QQ登录界面设计的案例进行了整合使用;第二部分,主要讲解了JavaFX图形用户工具的基本概念、开发环境配置、使用入门等。 8.8 本章小结 ===== 第 101 页 =====